package com.edu.exam.enums.quality.monitoring;

/**
 * 通知状态枚举
 * 
 * <p>定义通知的生命周期状态。</p>
 * 
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
public enum NotificationStatus {
    
    /**
     * 待发送
     * <p>通知已创建但尚未发送。</p>
     */
    PENDING("待发送", "通知已创建但尚未发送"),
    
    /**
     * 已计划
     * <p>通知已计划在特定时间发送。</p>
     */
    SCHEDULED("已计划", "通知已计划在特定时间发送"),
    
    /**
     * 发送中
     * <p>通知正在发送过程中。</p>
     */
    SENDING("发送中", "通知正在发送过程中"),
    
    /**
     * 已发送
     * <p>通知已成功发送。</p>
     */
    SENT("已发送", "通知已成功发送"),
    
    /**
     * 已送达
     * <p>通知已送达接收方。</p>
     */
    DELIVERED("已送达", "通知已送达接收方"),
    
    /**
     * 已阅读
     * <p>通知已被接收方阅读。</p>
     */
    READ("已阅读", "通知已被接收方阅读"),
    
    /**
     * 发送失败
     * <p>通知发送失败。</p>
     */
    FAILED("发送失败", "通知发送失败"),
    
    /**
     * 已取消
     * <p>通知已被取消发送。</p>
     */
    CANCELLED("已取消", "通知已被取消发送");
    
    private final String displayName;
    private final String description;
    
    NotificationStatus(String displayName, String description) {
        this.displayName = displayName;
        this.description = description;
    }
    
    public String getDisplayName() {
        return displayName;
    }
    
    public String getDescription() {
        return description;
    }
    
    /**
     * 根据显示名称获取枚举
     * 
     * @param displayName 显示名称
     * @return 对应的枚举值
     */
    public static NotificationStatus fromDisplayName(String displayName) {
        for (NotificationStatus status : values()) {
            if (status.getDisplayName().equals(displayName)) {
                return status;
            }
        }
        return PENDING;
    }
    
    /**
     * 判断是否为活跃状态
     * 
     * @return 如果是活跃状态返回true
     */
    public boolean isActive() {
        return this == PENDING || this == SCHEDULED || this == SENDING;
    }
    
    /**
     * 判断是否为完成状态
     * 
     * @return 如果是完成状态返回true
     */
    public boolean isCompleted() {
        return this == SENT || this == DELIVERED || this == READ || 
               this == FAILED || this == CANCELLED;
    }
    
    /**
     * 判断是否为成功状态
     * 
     * @return 如果是成功状态返回true
     */
    public boolean isSuccessful() {
        return this == SENT || this == DELIVERED || this == READ;
    }
}